home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / tie / infdmp / infdmp.c next >
Text File  |  1991-10-18  |  8KB  |  263 lines

  1. /*
  2.  *  TMENU.INF dump tool
  3.  
  4.  *  date            ed  notes
  5.  *  --------------  --  -------------------------------------
  6.  *  90/08/16        01  malor 君作のものをいただいて手直し
  7.  *  90/11/06 21:05  02  .inf ファイルをパラメータで指定できるようにした
  8.  *  91/08/15 05:55  10  TIEのおまけにつけるために、ほぼ完全に書き直した
  9. */
  10.  
  11. #define ANSI            /*  ANSI-C 準拠のチェックをする  */
  12.  
  13. #include "infdmp.h"
  14.  
  15. #define TRUE    (1)
  16. #define FALSE   (0)
  17.  
  18. static  const   def_path[] = "\\TMENU.INF" ;
  19. static  const   filemode[] = "rb" ;
  20.  
  21. static  char    *pathlist = NULL ;
  22. static  int     flag_pagepause = TRUE ;
  23. static  char    module_name[13] = "" ;
  24. static  char    *help_msg[] =
  25. {
  26. "",
  27. "   << infdmp >>  --  TownsMENU L30 のアイテムファイルの内容を表示する",
  28. "",
  29. "    usage: infdmp [opt] [パラメータ] [opt]",
  30. "",
  31. "    param:  アイテムファイルのパスリストを指定します(複数指定可)",
  32. "            フルパス指定された場合はそのファイルを表示し、ドライブ名のみ、",
  33. "              もしくはディレクトリ名まで指定されたときは、そのディレクトリの",
  34. "              TMENU.INF を表示します",
  35. "            また、ファイル名を指定するとき拡張子(.INF)は省略できます",
  36. "            パラメータが与えられなかった場合は、カレントドライブのルートに"
  37. "              ある TMENU.INF を表示します",
  38. "",
  39. "      opt:  -p  ページポーズ動作をおこなう(デフォルト)",
  40. "            -n  ページポーズ動作をおこなわない",
  41. NULL
  42. } ;
  43.  
  44. extern  void    inkey( char *message ) ;
  45. extern  void    dmpinf( FILE *fp ) ;
  46. extern  FILE    *fileopen( char *path, char *mode ) ;
  47.  
  48.  
  49. int     main( int argc, char **argv )
  50. {
  51.     char    *p ;
  52.     int     i, files = 0 ;
  53.  
  54.     /*  自分のパス名を格納  */
  55.     if( ( p = strrchr( argv[0], '\\' ) ) != NULL )  /*  階層の下のほう  */
  56.         strncpy( module_name, p+1, 12 ) ;
  57.     else if( ( p = strrchr( argv[0], ':' ) ) != NULL )   /*  ドライブ名付き  */
  58.         strncpy( module_name, p+1, 12 ) ;
  59.     else
  60.         strncpy( module_name, argv[0], 12 ) ;
  61.     module_name[12] = '\0' ;
  62.  
  63.     /*  パラメータとオプションの解釈  */
  64.     for( i = 1 ; i < argc ; i ++ )
  65.     {
  66.         if( *( p = argv[i] ) == '/' || *p == '-' )
  67.         {
  68.             while( *++p != '\0' )
  69.                 switch( tolower( *p ) )
  70.                 {
  71.                   default:
  72.                   case '?':  case 'h':      /*  ヘルプ  */
  73.                     for( i = 0 ; help_msg[i] ; i ++ )
  74.                         printf( "%s\n", help_msg[i] ) ;
  75.  
  76.                     if( *p != '?' && *p != 'h' && *p != 'H' )
  77.                         printf( "\n\a%s: オプションが間違っています"
  78.                                             " (-%c)\n", module_name, *p ) ;
  79.                     return 0 ;
  80.  
  81.                   case 'p':     /*  ページポーズ動作する  */
  82.                     flag_pagepause = TRUE ;
  83.                     break ;
  84.  
  85.                   case 'n':     /*  ページポーズ動作しない  */
  86.                     flag_pagepause = FALSE ;
  87.                     break ;
  88.                 }
  89.         }
  90.         else
  91.             files ++ ;
  92.     }
  93.  
  94.  
  95.     /*  メイン処理  */
  96.     if( files > 0 )     /*  複数パラメータ指定  */
  97.     {
  98.         for( i = 1 ; i < argc ; i ++ )
  99.         {
  100.             if( *( p = argv[i] ) == '-' || *p == '/' )  /*  オプション  */
  101.                 continue ;
  102.             pathlist = p ;
  103.             dmpinf( fileopen( p, (char *)filemode ) ) ;
  104.         }
  105.     }
  106.     else                /*  パラメータなし  */
  107.     {
  108.         pathlist = (char *)def_path ;
  109.         dmpinf( fopen( (char *)def_path, (char *)filemode ) ) ;
  110.     }
  111. }
  112.  
  113. static  FILE    *fileopen( char *path, char *mode )
  114. {
  115.     auto    FILE    *fp ;
  116.     static  char    buf[256] = "" ;
  117.  
  118.     switch( *(path+strlen( path )-1) )
  119.     {
  120.       case '\\':    /*  ディレクトリまでの指定であることが明白  */
  121.       case ':':     /*  ドライブ名までの指定であることが明白  */
  122.         strcpy( buf, path ) ;
  123.         strcat( buf, "TMENU.INF" ) ;
  124.         path = buf ;
  125.         break ;
  126.     }
  127.  
  128.     if( ( fp = fopen( path, mode ) ) == NULL )
  129.     {
  130.         if( strlen( buf ) == 0 )
  131.         {
  132.             strcpy( buf, path ) ;
  133.             strcat( buf, ".INF" ) ;     /*  拡張子のみ追加してみる  */
  134.  
  135.             if( ( fp = fopen( buf, mode ) ) != NULL )
  136.                 path = buf ;
  137.             else
  138.             {
  139.                 strcpy( buf, path ) ;
  140.                 strcat( buf, (char *)def_path ) ;
  141.                 if( ( fp = fopen( buf, mode ) ) != NULL )
  142.                     path = buf ;
  143.             }
  144.         }
  145.     }
  146.  
  147.     pathlist = path ;
  148.  
  149.     return fp ;
  150. }
  151.  
  152. static  void    dmpinf( FILE *fp )
  153. {
  154.     int     ln ;
  155.     int     max_cmdlen, max_paralen, len ;
  156.     char    *p  ;
  157.  
  158.     infrec  tmpbuf ;
  159.     INF     root, *last, *ip ;
  160.  
  161.     last = &root ;
  162.     last->next = NULL ;
  163.  
  164.  
  165.     /*  タイトル表示  */
  166.     printf( "\x0C\t\t*** TMENU.INF dump [%s] ***\n\n", pathlist ) ;
  167.  
  168.     /*  ファイルはみつかったのかな?  */
  169.     if( fp == NULL )
  170.     {
  171.         printf( "%s: can't open '%s'\n", module_name, pathlist ) ;
  172.         exit( 2 ) ;
  173.     }
  174.  
  175.     /*  読み込む  */
  176.     max_cmdlen = max_paralen = 0 ;
  177.  
  178.     while( fread( &tmpbuf, 1, INFBUFSIZ, fp ) != 0 )
  179.     {
  180.         /*  データ格納領域を獲得する  */
  181.         if( ( ip = (INF *)malloc( sizeof( INF ) ) ) == NULL )
  182.         {
  183.             printf( "%s: can't allocate memory\n", module_name ) ;
  184.             exit( 2 ) ;
  185.         }
  186.         last->next = ip ;
  187.         last = ip ;
  188.         last->next = NULL ;
  189.  
  190.         /*  必ず終端子が存在するようにする  */
  191.         tmpbuf.dummy = '\0' ;
  192.  
  193.         /*  コマンドをパスリストとパラメータに分解  */
  194.         if( ( p = strchr( (char *)tmpbuf.cmd, ' ' ) ) != NULL )
  195.         {                                           /*  パラメータあり  */
  196.             *p++ = '\0' ;
  197.             strcpy( (char *)ip->prm, p ) ;
  198.         }
  199.         else        /*  パラメータなし  */
  200.             ip->prm[0] = '\0' ;
  201.         strcpy( (char *)ip->cmd, (char *)tmpbuf.cmd ) ;
  202.  
  203.         if( ( len = strlen( (char *)ip->cmd ) ) > max_cmdlen )
  204.             max_cmdlen = len ;
  205.         if( ( len = strlen( (char *)ip->prm ) ) > max_paralen )
  206.             max_paralen = len ;
  207.  
  208.         /*  必要なデータだけをコピー  */
  209.         strncpy( (char *)ip->name, (char *)tmpbuf.name, 12 ) ;
  210.         ip->name[12] = '\0' ;
  211.         ip->icon_num = tmpbuf.icon_num ;
  212.     }
  213.  
  214.     if( !feof( fp ) && ferror( fp ) )   /*  EOF以外のエラーが発生した場合  */
  215.     {
  216.         printf( "%s: 読み込み時になんらかのエラーが発生しました "
  217.                             "(ERROR #%03d)\n", module_name, errno ) ;
  218.         exit( 2 ) ;
  219.     }
  220.  
  221.     fclose( fp ) ;
  222.  
  223.  
  224.     /*  データがあることを確認して、項目名を表示  */
  225.     if( root.next == NULL )
  226.         printf( ">>> アイテムが登録されていません <<<\n" ) ;
  227.     else
  228.     {
  229.         printf( "-icon - 名 称 -     " ) ;
  230.         printf( "%-*s", max_cmdlen, "- 起動コマンド -" ) ;
  231.         printf( " - パラメータ -\n" ) ;
  232.     }
  233.  
  234.     /*  内容表示  */
  235.     for( ln = 2, ip = root.next ; ip != NULL ; ip = ip->next, ln ++ )
  236.     {
  237.         len =  printf( "[%03d] %-12s  ", ip->icon_num, ip->name ) ;
  238.         len += printf( "%-*s", max_cmdlen, ip->cmd ) ;
  239.         if( strlen( (char *)ip->prm ) > 0 )
  240.         {
  241.             if( len + strlen( (char *)ip->prm ) > 75 )
  242.                 printf( "\n%19s", " " ), ln ++ ;
  243.             printf( " [%s]", ip->prm ) ;
  244.         }
  245.         putchar( '\n' ) ;
  246.  
  247.         if( ln > 20 && flag_pagepause == TRUE )
  248.         {
  249.             inkey( "-- more --" ) ;
  250.             ln = 0 ;
  251.         }
  252.     }
  253. }
  254.  
  255. static  void    inkey( char *msg )
  256. {
  257.     printf( msg ) ;
  258.     fflush( stdout ) ;
  259.     getch() ;
  260.     putchar( '\n' ) ;
  261. }
  262.  
  263.